package ar.com.grupo1.ler.negocio;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

import org.apache.log4j.Logger;

import ar.com.grupo1.ler.dominio.Vehiculo;
import ar.com.grupo1.ler.dominio.Viaje;
import ar.com.grupo1.ler.exceptions.BusinessException;
import ar.com.grupo1.ler.exceptions.ValoresInvalidosException;

/**
 * Responsable de asignar los viajes a los vehiculos
 * 
 */
public class Asignador {

	private static Logger logger = Logger.getLogger(Asignador.class);	

	/**
	 * Otiene los vehiculos disponibles para realizar el viaje pasado por
	 * parametro
	 * 
	 * @param viaje
	 * @return
	 */
	public static List<Vehiculo> getVehiculosDisponiblesParaViaje(List<Vehiculo> vehiculos, Viaje viaje) {
		List<Vehiculo> vehiculosDisponiblesParaViaje = null;
		if (vehiculos == null) {
			throw new BusinessException(
					"Vehiculos Nulo. No se puede obtener la disponibilidad de vehiculos parar hacer un viaje, cuando no existen vehiculos");
		}
		if (viaje == null) {
			throw new BusinessException(
					"Viaje Nulo. No se puede obtener la disponibilidad de vehiculos parar hacer un viaje, sin tener un viaje");
		}

		try {
			viaje.verificarViaje();
			vehiculosDisponiblesParaViaje = new ArrayList<Vehiculo>();
			for (Vehiculo vehiculo : vehiculos) {
				if (vehiculo.isDisponible(viaje)) {
					vehiculosDisponiblesParaViaje.add(vehiculo);
					logger.info("El vehiculo esta disponible para tomar el viaje.\nDatos del vehiculo: " + vehiculo);
				} else {
					logger.info("El vehiculo no esta disponible para tomar el viaje.\nDatos del vehiculo: " + vehiculo);
				}
			}
		} catch (ValoresInvalidosException e) {
			logger.error(e, e);
			throw new BusinessException(e);
		}

		return vehiculosDisponiblesParaViaje;
	}
	
	

	public static void asignarViaje(Vehiculo vehiculo, Viaje viaje) {
		vehiculo.addViaje(viaje);
	}

	/**
	 * Obtiene el consumo de combustible total de todos los viajes de cada
	 * vehiculo de la empresa
	 * 
	 * @return
	 */
	public static BigDecimal getConsumoTotalDeVehiculos(List<Vehiculo> vehiculos) {
		BigDecimal consumoTotal = new BigDecimal(0);
		if (vehiculos == null) {
			throw new BusinessException(
					"Vehiculos Nulo. No se puede obtener el consumo total de vehiculos, si no se dispone de vehiculos");
		}
		try {
			for (Vehiculo vehiculo : vehiculos) {
				consumoTotal = consumoTotal.add(vehiculo.getConsumoTotal());
			}
		} catch (ValoresInvalidosException e) {
			logger.error(e, e);
			throw new BusinessException(e);
		}
		return consumoTotal;
	}

	/**
	 * Calcula el gasto total de la empresa
	 * 
	 * @return
	 */
	public static BigDecimal getGastoTotal(List<Vehiculo> vehiculos) {
		BigDecimal gastoTotal = new BigDecimal("0");
		if (vehiculos == null) {
			throw new BusinessException(
					"Vehiculos Nulo. No se puede obtener el gasto total de vehiculos, si no se dispone de vehiculos");
		}
		try {
			for (Vehiculo vehiculo : vehiculos) {
				gastoTotal = gastoTotal.add(vehiculo.getGasto());
			}
		} catch (ValoresInvalidosException e) {
			logger.error(e, e);
			throw new BusinessException(e);
		}
		return gastoTotal;
	}
}
